const sqlite3 = require('sqlite3');  // 引入 sqlite3 模块
const path = require('path');  // 引入路径处理模块

const dbName = path.join(__dirname, 'data.db');  // 获取当前运行目录下的 data.db 文件
// 打开数据库
const db = new sqlite3.Database(dbName, err => {
    if (err !== null) console.log(err);  // 输出错误信息
});

// SQL 语句
const sql = `
CREATE TABLE user (
  id INTEGER PRIMARY KEY,
  user_name VARCHAR (30) NOT NULL,
  age TINYINT (3) NOT NULL DEFAULT 0
)
`;

// 创建表格
// db.run(sql, function (err) {
//     if (err) console.log(err);  // 如果出现错误就输出错误信息
//     console.log("create table user success")
// });

db.run('INSERT INTO user (user_name, age) VALUES (?, ?)', ['Mark', 28], function (err) {
    if (err) console.log(err);  // 如果有错误就输出错误信息
    console.log("insert line ==", this.changes);  // 输出受影响的行数
    console.log("insert last line", this.lastID);  // 输出 lastID
});

db.run('UPDATE user SET user_name = $newName WHERE user_name = $userName', {
    $userName: 'Mark',
    $newName: 'Jack'
}, function (err) {
    if (err) console.log(err);  // 如果有错误就输出错误信息
    console.log("update line ==", this.changes);  // 输出受影响的行数
    console.log("update last line", this.lastID);  // 输出 lastID
});

// all 方法可以查询多条数据，第一个参数就是 SQL 语句，后面的参数可以是用来替换占位符的内容，也可以是回调函数，回调函数需要放在最后。回调函数可以接收 err 和 rows 两个参数，err 就是错误信息，rows 是查询结果的数组，如果没有查询出内容 rows 就是一个空数组。
db.all('SELECT id, user_name, age FROM user', (err, rows) => {
    if (err) console.log(err);  // 如果出现错误就输出错误信息
    console.log("select result ==== ", rows);  // 输出查询结果
});

db.all('SELECT id, user_name, age FROM user WHERE user_name = ?', ['Jack'], (err, rows) => {
    if (err) console.log(err);  // 如果出现错误就输出错误信息
    console.log("aim select = ", rows);  // 输出查询结果
});

// get 方法的参数和 all 差不多，第一个参数是 SQL 语句，后面的参数可以是用来替换 SQL 中的占位符的内容，也可以是一个回调函数，回调函数需要在最后。函数可以接收 err 和 row ，err 是错误信息，row 是查询结果，如果没有查询出数据 row 就是 undefined 。
db.get('SELECT id, user_name, age FROM user', (err, row) => {
    if (err) console.log(err);
    console.log("get result = ", row);
});

